iv.calc                                         package:unknown                                          R Documentation

~~Calculadora de Valores Individuais (Pokmon)~~
  
  Descrio:
  
  ~~ iv.calc  uma funo criada para calcular os valores individuais (IVS) de seus pokmon dos jogos da gerao III ~~ 
  ~~ em diante. Como padro, a funo usa os valores base (database) da gerao VII em diante. ~~
  ~~ No funciona para o Pokmon GO. ~~
  
  Uso:
  
  ~~ iv.calc(pokemon, stats, EV, lvl, nature = "Hardy", interesse = NULL, database = base.stats) ~~
  
  Arguments:
  
  ~~ pokemon     O nome de pokmon que deseja calcular o IV. Deve vir escrito exatamente como consta o nome do ~~
  ~~             pokmon no database. Pode ser um valor nico ou um vetor contendo o nome de n pokmon. ~~
  ~~ stats       Os valores dos atributos de seus pokmon, na ordem: HP, ATK, DEF, Sp.A, Sp.D e SPD.  ~~ 
  ~~             Pode ser um vetor contendo apenas esses 6 valores, ou um data.frame contendo 6 colunas e n linhas ~~
  ~~             equivalentes a cada pokmon [1 <= stats <= 714]. ~~
  ~~ EV          Os EVs ou valores de esforo de seus pokmon, na ordem: HP, ATK, DEF, Sp.A, Sp.D e SPD. ~~
  ~~             Pode ser um vetor contendo apenas esses 6 valores, ou um data.frame contendo 6 colunas e n linhas ~~
  ~~             equivalentes a cada pokmon [0 <= EV <= 252; sum(EV) < 510]. ~~ 
  ~~ lvl         O nvel de seus pokmon. Pode ser um valor nico ou um vetor contendo os nveis de n pokmon.  ~~ 
  ~~             [1 <= lvl <= 100]. ~~
  ~~ nature      A natureza de seus pokmon. Deve vir escrita da seguinte forma: "Hardy","Bashful","Adamant", etc.  ~~ 
  ~~             Tambm deve conter apenas os nomes das 25 possveis naturezas dos pokmon. Pode ser um valor nico ~~
  ~~             ou um vetor contendo as naturezas de n pokmon. ~~
  ~~ interesse   Dados vrios pokmon (n > 1), o usurio pode escolher um pokmon de interesse em ~~ 
  ~~             particular para ser comparado com os demais pokmon em relao a seus IVs. Deve ser um nmero inteiro ~~
  ~~             nico de 1 a n, correspondente a posio do pokmon de interesse no vetor pokemon. ~~ 
  ~~ database    Um dataframe contendo 7 colunas, sendo a primeira coluna o nome de todos os Pokmon e as demais  ~~ 
  ~~             colunas seus atributos basais, utilizados no clculo dos IVs, na ordem HP, ATK, DEF, Sp.A, Sp.D e SPD. ~~
  ~~             Caso o usurio no fornea um database, ele  baixado diretamente da internet. ~~
  
  
  Detalhes:
  
  ~~ Frmulas usadas nessa funo: ~~
  ~~ Clculo do HP:                     HP = ((2*ValorBasal + IV + EV/4 + 100) * Nvel) / 100 + 10 ~~
  ~~ Clculo dos demais atributos:      Atributo = (((2*ValorBasal + IV + EV/4) * Nvel) / 100 + 5) * Natureza ~~
  
  ~~ Caso o usurio fornea valores errados para stats, lvl, EV ou nature, a funo ir rodar, porm, podero ser ~~
  ~~ criados valores impossveis de IV impossveis (0 <= IV <= 31). Nesse caso, o usurio receber um aviso e a sada ~~
  ~~ conter NAs e listas vazias. ~~
  
  ~~ Os valores de stats variam de 1 a 714 pois esses so o menor e maior valor que um pokmon pode ter. ~~
  ~~ Shedinja sempre possui 1 de HP e uma Blissey com 31 de IV e 252 de EVs pode atingir 714 HP. ~~
  ~~ Por esse motivo, caso os valores ultrapassem esse limite, escolhi que a funo parasse automaticamente, ~~
  ~~ evitando a criao de NAs mais para frente. ~~
    
  ~~ As natureza dos pokmon entram na frmula na forma de um multiplicador que pode assumir os valores 1.1, 1 ou 0.9 ~~
  ~~ caso elas sejam respectivamente, "positivas", "neutras" ou "negativa" para determinado atributo. ~~
  ~~ Por ser uma natureza neutra para todos os atributos, "Hardy" foi colocada como padro para a funo. ~~
  
  ~~ Alm de calcular os IVs dos pokmon, a funo tambm calcula o spread de seus IVs. Isto , os valores de IV ~~
  ~~ que gerariam um valor igual ao valor do atributo do pokmon quando arredondado para zero casas decimais. ~~
  ~~ Isso ocorre pois a frmula do clculo dos IVs gera nmeros reais, porm os IVs podem apenas ser nmeros inteiros. ~~
  ~~ Ademais, dadas as frmulas, quanto menor o nvel dos pokmon, maior  o erro associado ao clculo do IV. ~~
  
  ~~ Caso sejam fornecidos n > 1 pokmon, a funo possui uma sada grfica (scatterplot), onde os valores dos ~~
  ~~ IVs de cada atributo so mostrados graficamente, separados pelas cores que eles apresentam nos jogos. ~~
  ~~ Ademais, a funo tambm adiciona uma linha horizontal referente ao limiar de IVs que  considerado "muito bom" ~~
  ~~ (IV >= 26). Por fim, caso o usurio fornea um pokmon de interesse em particular, este recebe destaque no grfico ~~
  ~~ e tambm vir com uma barra de erro referente aos valores de spread possvel dos seu IVs. ~~

  
  Value:
  
  ~~ Retorna uma de duas listas possveis. ~~
  ~~ Se pokemon tiver n = 1, ou n > 1 & interesse = NULL ~~

[[1]] IVs Medianos     : Um vetor para n = 1 ou um data.frame para n > 1, contendo os IVs de cada um dos pokmon.

[[2]] IV Spread - HP   : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de HP de cada um dos pokmon.

[[3]] IV Spread - ATK  : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de ATK de cada um dos pokmon.

[[4]] IV Spread - DEF  : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de DEF de cada um dos pokmon.

[[5]] IV Spread - Sp.A : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de Sp.A de cada um dos pokmon.

[[6]] IV Spread - Sp.D : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de Sp.D de cada um dos pokmon.

[[7]] IV Spread - SPD  : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de SPD de cada um dos pokmon.

  ~~ Se pokemon tiver n > 1 & interesse != NULL ~~

[[1]] IVs Medianos     : Um vetor para n = 1 ou um data.frame para n > 1, contendo os IVs de cada um dos pokmon.

[[2]] IVs maiores      : Uma lista com a posio dos pokmon no parmetro pokemon que possuem os IVs maiores que o pokmon de
                         interesse em cada um dos atributos.

[[3]] IVs menores      : Uma lista com a posio dos pokmon no parmetro pokemon que possuem os IVs menores que o pokmon de
                         interesse em cada um dos atributos.

[[4]] IVs em spread    : Uma lista com a posio dos pokmon no parmetro pokemon que possuem os IVs dentro do intervalo de 
                         spread para o pokmon de interesse em cada um dos atributos. (Contm o prprio pokmon de interesse).


  Notas:
  
  ~~ O objeto de sada pode ficar extremamente poludo para um n grande de pokmon, porm, dada a natureza dos spreads, ~~
  ~~ os quais so vetores de 0 at 32 posies, no era possvel salv-los em um formato que no lista. ~~
  ~~ Use a indexao das listas ([[]]) acima para facilitar a vizualio. ~~
  
  Autor:
  
  ~~ Diego Pereira Nogueira da Silva ~~
  
  Referncias:
  
  ~~ Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Individual_values ~~
  
  Examples:
 
 ## Exemplo para 1 pokmon 
  exemplo = iv.calc(pokemon="Bulbasaur",
                    stats=c(110,69,60,80,80,50),
                    EV=c(0,0,0,0,0,0),
                    lvl=50,
                    nature="Brave")
                    
 ## Exemplo para mais de um pokmon e interesse = NULL
  exemplo2 = iv.calc(pokemon=c("Bulbasaur","Blissey"),
                     stats=data.frame(HP=c(110,623),ATK=c(69,51),DEF=c(60,51),Sp.A=c(80,174),Sp.D=c(80,285),SPD=c(50,122)),
                     EV=data.frame(EVHP=c(0,0),EVATK=c(0,0),EVDEF=c(0,0),EVSp.A=c(0,0),EVSp.D=c(0,0),EVSPD=c(0,0)),
                     lvl=c(50,100),
                     nature=c("Brave","Brave"))
                    
 ## Exemplo para mais de um pokmon de interesse != NULL
  exemplo3 = iv.calc(pokemon=c("Bulbasaur","Blissey","Pikachu"),
                     stats=data.frame(HP=c(110,623,166),ATK=c(69,51,116),DEF=c(60,51,85),
                                      Sp.A=c(80,174,110),Sp.D=c(80,285,111),SPD=c(50,122,189)),
                     EV=data.frame(EVHP=c(0,0,50),EVATK=c(0,0,50),EVDEF=c(0,0,50),
                                   EVSp.A=c(0,0,50),EVSp.D=c(0,0,50),EVSPD=c(0,0,50)),
                     lvl=c(50,100,75),
                     nature=c("Brave","Brave","Hasty"),
                     interesse=3)
                     
 ## Exemplo simulando muitos pokmon
  a = matrix(round(runif(300,0,31)), ncol=6)
  b = data.frame(rep("Articuno",50))
  base.stats = read.csv(url("http://ecologia.ib.usp.br/bie5782/lib/exe/fetch.php?media=bie5782:01_curso_atual:alunos:trabalho_final:diego.pereira.silva:base.stats.csv"), as.is=T)
  nat.mat = matrix(c(rep(1, 5),1.1,0.9,1,1,1,1.1,1,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,0.9,1.1,1,1,1,rep(1, 5),
                         1,1.1,0.9,1,1,1,1.1,1,0.9,1,1,1.1,1,1,0.9,0.9,1,1.1,1,1,1,0.9,1.1,1,1,rep(1, 5),1,1,1.1,0.9,1,
                         1,1,1.1,1,0.9,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,1.1,1,rep(1, 5),1,1,1,1.1,0.9,0.9,1,1,1,1.1,
                        1,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,1.1,rep(1, 5)), 
                   ncol=5, byrow=T, 
                   dimnames=list(c("Hardy","Lonely","Adamant","Naughty","Brave","Bold","Docile","Impish","Lax","Relaxed",
                                   "Modest","Mild","Bashful","Rash","Quiet","Calm","Gentle","Careful","Quirky","Sassy",
                                   "Timid","Hasty","Jolly","Naive","Serious"), 
                                 c("ATK","DEF","Sp.A","Sp.D","SPD")))
  b[,2:7] = (c(round((((2*base.stats[base.stats[,1]=="Articuno",2] + a[,1] + 0 + 100) * 100) / 100 + 10)),
               round((((2*base.stats[base.stats[,1]=="Articuno",3] + a[,2] + 0) * 100) / 100 + 5) * nat.mat["Calm",1]),
               round((((2*base.stats[base.stats[,1]=="Articuno",4] + a[,3] + 0) * 100) / 100 + 5) * nat.mat["Calm",2]),
               round((((2*base.stats[base.stats[,1]=="Articuno",5] + a[,4] + 0) * 100) / 100 + 5) * nat.mat["Calm",3]),
               round((((2*base.stats[base.stats[,1]=="Articuno",6] + a[,5] + 0) * 100) / 100 + 5) * nat.mat["Calm",4]),
               round((((2*base.stats[base.stats[,1]=="Articuno",7] + a[,6] + 0) * 100) / 100 + 5) * nat.mat["Calm",5])))
  b[,8:13] = 0
  b[,14] = 100
  b[,15] = "Calm"
  exemplo4 = iv.calc(b[,1], b[,2:7], b[,8:13], b[,14], b[,15], interesse=25)
      